package scrabble;


import java.awt.Color;
import java.awt.Cursor;
import java.awt.LayoutManager;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DragGestureEvent;
import java.awt.dnd.DragGestureListener;
import java.awt.dnd.DragSource;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;  
import javax.swing.border.LineBorder;
    

class Fenetre  extends JPanel implements DragGestureListener {
public static int langue=1;
private JButton arreter;
private JButton nouvellePartie;
private JButton echanger;
private JButton passer;
private JButton valider;
private MyListener listener;
private MyListener2 listener2;
private Sachet sac;
private Joueur joueur1;
private Joueur joueur2;
private Chevalet chev;
private Plateau plat;
private Horloge miniteur;
private final LayoutManager BoxLayout=null;
private   MyDropTargetListener myDropTargetListener;
private MyDropTargetListenerBack myDropTargetListnerBack;
private Fenetre f;
private Lettre l;
private JPanel scorepnl = new JPanel();
private JLabel scorej1 = new JLabel("JOUEUR1: ");
private JLabel scorej2 = new JLabel("JOUEUR2: ");
private JLabel scorej1i = new JLabel();
private JLabel scorej2i = new JLabel();
private JLabel recherchelbl = new JLabel("Recherche");
private JButton recherchebtn = new JButton(new ImageIcon("../rechercher.jpg" ));
private JLabel lettres = new JLabel();
private JLabel lettres1 = new JLabel(" Les lettres restantes: ");
public  JTextField recherche ;
JPanel panelCh;
private Jeu jeu;
private CaseVide c;
private CaseVide ca;
private int j=1;
private JButton help;
private int ch;
private  String nom1="Joueur 1";
private String nom2="Joueur 2";
private Lettre lettre_a_echanger;
private CaseVide case_a_echanger;
 private boolean lettre_set=false;
private boolean case_set=false;
private ChoixEchange fenetreEchange;
private int ech=0,p1=0,p2=0;
public Fenetre(Jeu jeu, int i,String nom1,String nom2)
{this.ch=i;
this.f=this;
this.jeu=jeu;
this.nom1=nom1;
this.nom2=nom2;
myDropTargetListener=new  MyDropTargetListener();
myDropTargetListnerBack=new MyDropTargetListenerBack();

arreter= new JButton(new ImageIcon("../arreter.jpg" ));
nouvellePartie=new JButton(new ImageIcon("../NouvellePartie.jpg" ));
echanger= new JButton(new ImageIcon("../echanger.jpg" ));
passer= new JButton(new ImageIcon("../passer.jpg" ));
valider= new JButton(new ImageIcon("../valider.jpg" ));
recherche=new JTextField();
help = new JButton(new ImageIcon("../règles.jpg" ));

listener2 = new MyListener2(recherche);
this.setLayout(BoxLayout);





arreter.setBounds(50, 70, 104, 50);
add(arreter);
arreter.setActionCommand("arreter");
nouvellePartie.setBounds(50, 150, 104, 50);	
add(nouvellePartie);
echanger.setBounds(50, 230, 104, 50);	
add(echanger);
passer.setBounds(50, 310, 104, 50);
add(passer);
if(ch==1)
passer.setEnabled(false);
valider.setBounds(50, 390, 104, 50);
help.setBounds(50,470,104,50);
add(help);
help.setActionCommand("help");
passer.setActionCommand("passer");
valider.setActionCommand("valider");
echanger.setActionCommand("echanger");
nouvellePartie.setActionCommand("nouvellePartie");
add(valider);
sac = new Sachet_en();
joueur1=new Joueur(null, sac, this);
chev = joueur1.getChevalet();
plat=new Plateau(myDropTargetListener,chev);
listener = new MyListener();
 valider.addActionListener(listener);
 arreter.addActionListener (listener);
 nouvellePartie.addActionListener (listener);
echanger.addActionListener (listener);
passer.addActionListener (listener);
recherchebtn.addActionListener(listener2);
help.addActionListener(listener);
 miniteur =new Horloge();
 if(ch==2)
 {joueur2= new Joueur(null, sac, this);
 scorej1i.setBounds(1100, 500, 200, 50);
 scorej2i.setBounds(1100, 550, 200, 50);
 scorej1.setBounds(1100, 500, 200, 50);
 scorej2.setBounds(1100, 550, 200, 50);
 scorej1i.setIcon(new ImageIcon("../JoueurIn.jpg"));
 scorej2i.setIcon(new ImageIcon("../JoueurOut.jpg"));
 scorej1.setText("  "+nom1+" 0");
 scorej2.setText("  "+nom2+" 0");
 this.add(scorej1);
 this.add(scorej2);
 this.add(scorej1i);
 this.add(scorej2i);
 
 }
 else
 {
  scorej1i.setBounds(1100, 500, 200, 50);
  scorej1.setBounds(1100, 500, 200, 50);
  scorej1.setText("  "+nom1+"  0");
  scorej1i.setIcon(new ImageIcon("../JoueurIn.jpg"));
  this.add(scorej1);
  this.add(scorej1i);
 }
 recherche.setBounds(1100,250,200,40);
 recherchelbl.setBounds(1100,180,200,40);
 recherchebtn.setBounds(1150,300,104,50);
 recherche.setSize(200, 40);
 recherche.setBackground(Color.white);
 recherche.setBorder(new LineBorder(Color.black,5));
 lettres1.setBounds(50, 650, 200, 50);
 lettres1.setIcon(new ImageIcon("../Sachet .JPG" ));
 lettres.setBounds(50, 650, 200, 50);
 this.add(recherchelbl);
 this.add(recherche);
 this.add(recherchebtn);
 this.add(lettres);
 this.add(lettres1);
lettres.setText(" Lettres restantes: "+sac.nb_lettres_restantes());
this.add(plat);
this.add(chev);
this.add(miniteur);



}

void affiche_chev()
{
   this.remove(chev);
  if(j==1)
{
chev = joueur1.getChevalet();
}
else
{
 chev = joueur2.getChevalet(); 
}  
  this.add(chev);  
}
void permuter()
{
  if(j==1)
      j=2;
  else
      j=1;
}

     @Override
    public void dragGestureRecognized(DragGestureEvent event) {
   
      
    try{   Cursor cursor = null;
 if("class scrabble.Lettre".equals(event.getComponent().getClass().toString()))
    l = (Lettre) event.getComponent();
 else
      ca=(CaseVide)event.getComponent();
        
    if (event.getDragAction() == DnDConstants.ACTION_MOVE) {
    cursor = DragSource.DefaultMoveDrop;

       
    
    }
    event.startDrag(cursor, new Transferable() {
  DataFlavor colorFlavor = new DataFlavor(Case.class,"");
  DataFlavor[] supportedFlavors = { colorFlavor };
            @Override
            public DataFlavor[] getTransferDataFlavors() {
                 return supportedFlavors;
            }

            @Override
            public boolean isDataFlavorSupported(DataFlavor flavor) {
               return true;
            }

            @Override
            public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
                return new Object();
            }
        });
        }
      
catch(Exception e){}
     
    }
      

    void addlettres() {
        lettres.setText(lettres.getText()+sac.nb_lettres_restantes());
    }
     
     public class MyDropTargetListener implements DropTargetListener {


   public MyDropTargetListener() {
     
 

    
    }
   
@Override
     public void drop(DropTargetDropEvent event) {
int i=0;    String response ;
    c=(CaseVide)((DropTarget)event.getSource()).getComponent();

    event.acceptDrop(DnDConstants.ACTION_MOVE);
   
    if(l.getIcon()!=null)
        {
    if (l.getNom()==' ')
{ do
{response = JOptionPane.showInputDialog(null,
  "En quelle lettre voulez changer votre joker?",
  "Entrer une lettre",
  JOptionPane.QUESTION_MESSAGE); 

}
    while(response.equals("") && response.length()!=1);

 char car;
      
     if(response.charAt(0)>='a' && response.charAt(0)<='z')
        car=(char)((int)response.charAt(0)-32);
     else
     { if((response.charAt(0)>='A' && response.charAt(0)<='Z'))
             car=response.charAt(0);
             else
             car='0';
     }
     
        l.setNom(car);
        
 }

   
 c.setIcon(l.getIcon());
 
     c.setLettre(new Lettre(l,f));
 
 plat.setPos(c.getPosLigne(), c.getPosColonne());
l.setIcon(null);
l.setNom('0');
 

 DragSource ds=new DragSource();
 
 ds.createDefaultDragGestureRecognizer(c, DnDConstants.ACTION_MOVE,f);
      
event.dropComplete(true);
   
     c.setDropTarget(false); 
         
 }
          
      }


    @Override
    public void dragEnter(DropTargetDragEvent dtde) {
      
    }

    @Override
    public void dragOver(DropTargetDragEvent dtde) {
        
    }

    @Override
    public void dropActionChanged(DropTargetDragEvent dtde) {
        
    }

    @Override
    public void dragExit(DropTargetEvent dte) {
        
    }

    
      
      
    
    
    
}
      public class MyDropTargetListenerBack implements DropTargetListener 
       {
           public void setAttributs()
           {
               
           }

        @Override
        public void dragEnter(DropTargetDragEvent dtde) {
           
        }

        @Override
        public void dragOver(DropTargetDragEvent dtde) {
            
        }

        @Override
        public void dropActionChanged(DropTargetDragEvent dtde) {
            
        }

        @Override
        public void dragExit(DropTargetEvent dte) {
           
        }

        @Override
        public void drop(DropTargetDropEvent event) {
         
          try {event.acceptDrop(DnDConstants.ACTION_MOVE);
            chev.ajouterItem(ca);
           
           
             ca.setLettre(null);
             ca.setImagecon();
        
            ca.setDropTarget(true);
             plat.setPos(ca);
            event.dropComplete(true);
            } 
            catch (Exception e){}
        }
       
           
       }
   public Fenetre.MyDropTargetListenerBack getDropTargetBack()
   {
       return myDropTargetListnerBack;
   }
         public class MyListener implements ActionListener
{
  Choix ch1;
   public  MyListener()
   {
     
   }
    @Override
    public void actionPerformed (ActionEvent e)
    {
        if(e.getActionCommand().equals("passer")) 
         {
             lettres.setText(" Lettres restantes: "+sac.nb_lettres_restantes()); 
            if(j==2)
          {
             scorej1i.setIcon(new ImageIcon("../JoueurIn.jpg"));
             scorej2i.setIcon(new ImageIcon("../JoueurOut.jpg"));
             scorej1.repaint();
             scorej2.repaint();
             p2=1;
            }
         else
         { 
             scorej1i.setIcon(new ImageIcon("../JoueurOut.jpg"));
             scorej2i.setIcon(new ImageIcon("../JoueurIn.jpg"));
             scorej1.repaint();
             scorej2.repaint();
             p1=1;
         }
          f.permuter();
          f.affiche_chev();
         if(p1==1&&p2==1)
         {int g=0;
         if(joueur1.getScore()>joueur2.getScore())
             g=1;
         if(joueur1.getScore()<joueur2.getScore())
             g=2;
         if(g==1)
           JOptionPane.showMessageDialog(null,nom1+" gagne!!!\nLe score marqué est de "+joueur1.getScore()+" points");
         if(g==2)
           JOptionPane.showMessageDialog(null,nom2+" gagne!!!\nLe score marqué est de "+joueur2.getScore()+" points");
         if(g==0)
           JOptionPane.showMessageDialog(null,"égalité\nLe score marqué est de "+joueur1.getScore()+" points"); 
         System.exit(0);
         }
         }
        
        if(e.getActionCommand().equals("help")) 
         {
            regles r = new regles(); 
         }
        if (e.getActionCommand().equals("arreter"))
    { int choice =JOptionPane.showOptionDialog(null, 
      "Voulez vous vraiment quitter partie?", 
      "Quittez la partie?", 
      JOptionPane.YES_NO_OPTION, 
      JOptionPane.QUESTION_MESSAGE, 
      null, null, null);
      if (choice == JOptionPane.YES_OPTION) 
        System.exit (0);
    }
    else
        if(e.getActionCommand().equals("valider"))
        {
         if(plat.valide())
         {ech=0;
         p1=0;
         p2=0;
         lettres.setText(" Lettres restantes: "+sac.nb_lettres_restantes());
         if(ch==2)
         {
                  if(j==2)
         {
             scorej1i.setIcon(new ImageIcon("../JoueurIn.jpg"));
             scorej2i.setIcon(new ImageIcon("../JoueurOut.jpg"));
             scorej1.repaint();
             scorej2.repaint();
             joueur2.setScrore(plat.comptage(plat.orientation()));
             scorej2.setText("  "+nom2+"  "+Integer.toString(joueur2.getScore()));
             
              
         }
         else
         {
             scorej1i.setIcon(new ImageIcon("../JoueurOut.jpg"));
             scorej2i.setIcon(new ImageIcon("../JoueurIn.jpg"));
             scorej1.repaint();
             scorej2.repaint();
             joueur1.setScrore(plat.comptage(plat.orientation()));
             scorej1.setText("  "+nom1+"  "+Integer.toString(joueur1.getScore()));

         }        
         }
         else
         {
          joueur1.setScrore(plat.comptage(plat.orientation()));
          scorej1.setText("  "+nom1+"  "+ Integer.toString(joueur1.getScore()));   
         }
         f.permuter();
         f.affiche_chev();
         plat.reinitialiser();
         chev.actualiser();
         plat.getnb();
         if(sac.nb_lettres_restantes()<12)
             echanger.setEnabled(false);
         if(sac.nb_lettres_restantes()==0)
         {int g=0;
         if(joueur1.getScore()>joueur2.getScore())
             g=1;
         if(joueur1.getScore()<joueur2.getScore())
             g=2;
         if(g==1)
           JOptionPane.showMessageDialog(null,nom1+" gagne!!!\nLe score marqué est de "+joueur1.getScore()+" points");
         if(g==2)
           JOptionPane.showMessageDialog(null,nom2+" gagne!!!\nLe score marqué est de "+joueur2.getScore()+" points");
         if(g==0)
           JOptionPane.showMessageDialog(null,"égalité\nLe score marqué est de "+joueur1.getScore()+" points"); 
         System.exit(0);
         }
         }
         
    else
         {
             plat.reinitialserChevalet();
             plat.reinitialiser();
          
         }  
         }
             
        if(e.getActionCommand().equals("echanger")) 
        { 
            p1=0;
            p2=0;
       if(ch==1)
       {
        try{fenetreEchange=new ChoixEchange(chev,plat);
       }catch(Exception e2){}
       ech++;
       if(ech>3)
       {
       int choice =JOptionPane.showOptionDialog(null, 
      "Vous avez dépasser le limite d'échange Voulez vous continuer?", 
      "Erreur", 
      JOptionPane.YES_NO_OPTION, 
      JOptionPane.QUESTION_MESSAGE, 
      null, null, null);
       if(choice==JOptionPane.NO_OPTION)
       {
        JOptionPane.showMessageDialog(null,"votre score est"+joueur1.getScore());
        System.exit(0);   
       }
       }
       }
       else
       {
             try{fenetreEchange=new ChoixEchange(chev,plat);
       }catch(Exception e2){}
         if(j==2)
          {
             scorej1i.setIcon(new ImageIcon("../JoueurIn.jpg"));
             scorej2i.setIcon(new ImageIcon("../JoueurOut.jpg"));
             scorej1.repaint();
             scorej2.repaint();
             
              
            }
         else
         { 
             scorej1i.setIcon(new ImageIcon("../JoueurOut.jpg"));
             scorej2i.setIcon(new ImageIcon("../JoueurIn.jpg"));
             scorej1.repaint();
             scorej2.repaint();
         }
          f.permuter();
          f.affiche_chev();
         lettres.setText(" Lettres restantes: "+sac.nb_lettres_restantes());
         
       }
        }
         if(e.getActionCommand().equals("nouvellePartie")) 
       {int choice =JOptionPane.showOptionDialog(null, 
      "Voulez vous vraiment créer une nouvelle partie?", 
      "Nouvelle partie?", 
      JOptionPane.YES_NO_OPTION, 
      JOptionPane.QUESTION_MESSAGE, 
      null, null, null);
      if (choice == JOptionPane.YES_OPTION)
      {  jeu.dispose();
        ch1=new Choix();
      jeu=null;
      }
     
      
       }
         
    }
}  
     

}